#ifndef _DES_H_
#define _DES_H_

#include "stdint.h"
#include "string.h"
#include "stdbool.h"

#define ENCRYPT                         0 // 加密
#define DECRYPT                         1 // 解密

/**
 * @brief 执行 DES 加密
 *
 * @param pKeyIn   - 密钥
 * @param pDataIn  - 输入的数据
 * @param pDataOut - 输出的数据
 */
extern void CalDesEncrypt(const uint8_t *pKeyIn, const uint8_t *pDataIn, uint8_t *pDataOut);

/**
 * @brief 执行 DES 解密
 *
 * @param pKeyIn   - 密钥
 * @param pDataIn  - 输入的数据
 * @param pDataOut - 输出的数据
 */
extern void CalDesDecrypt(const uint8_t *pKeyIn, const uint8_t *pDataIn, uint8_t *pDataOut);

/**
 * @brief 3DES 加密（ECB）
 *
 * @param pKeyIn   - 密钥
 * @param pDataIn  - 输入数据
 * @param pDataOut - 输出数据
 */
extern void CalTripleDesEcbEncrypt(const uint8_t *pKeyIn, const uint8_t *pDataIn, uint8_t *pDataOut);

/**
 * @brief 3DES 解密（ECB）
 *
 * @param pKeyIn   - 密钥
 * @param pDataIn  - 输入数据
 * @param pDataOut - 输出数据
 */
extern void CalcTripleDesEcbDecrypt(const uint8_t *pKeyIn, const uint8_t *pDataIn, uint8_t *pDataOut);

/**
 * @brief 3DES 加密（CBC）
 *
 * @param pDataIn    - 输入的源文数据流
 * @param SizeIn     - 源文数据流长度
 * @param pKeyValue  - 密钥
 * @param pInitValue - 初始化向量
 * @param pDataOut   - 密文数据流
 * @param pSizeOut   - 密文数据流长度
 */
extern void CalTripleDesCbcEncrypted(const uint8_t *pDataIn, uint32_t SizeIn, const uint8_t *pKeyValue, const uint8_t *pInitValue, uint8_t *pDataOut, uint32_t *pSizeOut);

/**
 * @brief 3DES 解密（CBC）
 * 
 * @param pDataIn    - 输入的源文数据流
 * @param SizeIn     - 源文数据流长度
 * @param pKeyValue  - 密钥
 * @param pInitValue - 初始化向量
 * @param pDataOut   - 密文数据流
 * @param pSizeOut   - 密文数据流长度
 */
extern void CalTripleDesCbcDecrypt(const uint8_t *pDataIn, uint32_t SizeIn, const uint8_t *pKeyValue, const uint8_t *pInitValue, uint8_t *pDataOut, uint32_t *pSizeOut);

/**
 * @brief 密钥分散
 * 
 * @param pDataIn   - 分散因子
 * @param pKeyValue - 密钥
 * @param pDataOut  - 分散结果
 */
extern void Derive3DESKey(const uint8_t *pDataIn, const uint8_t *pKeyValue, uint8_t *pDataOut);

#endif
